/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.db.interfaces.Match;
import com.rhf.core.dto.MatchVO;

/**
 * Implémentation des requêtes SQP (psql) poru la table "match"
 * 
 * @author fabiensaulnier
 * 
 */
public class MatchImp extends Base implements Match {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Match#contructeur(java.sql.ResultSet)
	 */
	public MatchVO contructeur(ResultSet rs) throws Exception {

		MatchVO matchVO = new MatchVO();

		try {

			matchVO.setMatchId(rs.getInt("match_id"));
			matchVO.setDateCreation(rs.getTimestamp("date_creation"));
			matchVO.setDateModification(rs.getTimestamp("date_modification"));
			matchVO.setAuteurId(rs.getInt("auteur_id"));
			matchVO.setEvenementId(rs.getInt("evenement_id"));
			matchVO.setDateHeureMatch(rs.getTimestamp("date_heure_match"));
			matchVO.setLieu(rs.getString("lieu"));
			matchVO.setEquipeA(rs.getInt("equipe_a"));
			matchVO.setEquipeB(rs.getInt("equipe_b"));
			matchVO.setScoreA(rs.getInt("score_a"));
			matchVO.setScoreB(rs.getInt("score_b"));
			matchVO.setForfaitA(rs.getInt("forfait_a"));
			matchVO.setForfaitB(rs.getInt("forfait_b"));
			matchVO.setCommentaire(rs.getString("commentaire"));
			matchVO.setActif(rs.getInt("actif"));

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return matchVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Match#ajouterMatch(com.rhf.core.db.valuesobjects
	 * .MatchVO )
	 */
	public int ajouterMatch(MatchVO matchVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "INSERT INTO match ";
		query += "(auteur_id, evenement_id, date_heure_match, lieu, equipe_a, equipe_b, score_a, score_b, forfait_a, forfait_b, commentaire, actif) ";
		query += "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, matchVO.getAuteurId());
			stmt.setInt(i++, matchVO.getEvenementId());
			stmt.setTimestamp(i++, matchVO.getDateHeureMatch());
			stmt.setString(i++, matchVO.getLieu());
			stmt.setInt(i++, matchVO.getEquipeA());
			stmt.setInt(i++, matchVO.getEquipeB());
			stmt.setInt(i++, matchVO.getScoreA());
			stmt.setInt(i++, matchVO.getScoreB());
			stmt.setInt(i++, matchVO.getForfaitA());
			stmt.setInt(i++, matchVO.getForfaitB());
			stmt.setString(i++, matchVO.getCommentaire());
			stmt.setInt(i++, matchVO.getActif());

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Match#modifierMatch(com.rhf.core.db.valuesobjects
	 * . MatchVO)
	 */
	public int modifierMatch(MatchVO matchVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "UPDATE match ";
		query += "SET date_modification = now(), auteur_id = ?, evenement_id = ?, date_heure_match = ?, lieu = ?, equipe_a = ?, equipe_b = ?, score_a = ?, score_b = ?, forfait_a = ?, forfait_b = ?, commentaire = ?, actif = ? ";
		query += "WHERE match_id = ?";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, matchVO.getAuteurId());
			stmt.setInt(i++, matchVO.getEvenementId());
			stmt.setTimestamp(i++, matchVO.getDateHeureMatch());
			stmt.setString(i++, matchVO.getLieu());
			stmt.setInt(i++, matchVO.getEquipeA());
			stmt.setInt(i++, matchVO.getEquipeB());
			stmt.setInt(i++, matchVO.getScoreA());
			stmt.setInt(i++, matchVO.getScoreB());
			stmt.setInt(i++, matchVO.getForfaitA());
			stmt.setInt(i++, matchVO.getForfaitB());
			stmt.setString(i++, matchVO.getCommentaire());
			stmt.setInt(i++, matchVO.getActif());
			stmt.setInt(i++, matchVO.getMatchId());

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Match#recupererListeMatchParEvenement(int)
	 */
	public List<MatchVO> recupererListeMatchParEvenement(int evenementId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<MatchVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM match WHERE evenement_id = ? ORDER BY date_heure_match";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<MatchVO>();
				list.add(contructeur(rs));
				while (rs.next()) {
					list.add(contructeur(rs));
				}
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Match#recupererMatch(int)
	 */
	public MatchVO recupererMatch(int matchId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		MatchVO matchVO = null;

		// Requête SQL
		String query = "SELECT * ";
		query += "FROM match";
		query += "WHERE match_id = ?";

		try {

			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, matchId);

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				matchVO = contructeur(rs);
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return matchVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Match#supprimerMatch(int)
	 */
	public int supprimerMatch(int matchId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "DELETE FROM match ";
		query += "WHERE match_id = ? ";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, matchId);

			// Exécution de la Requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

}
